//#include <iostream>
//#include <string>
//using namespace std;
//
//const int N = 110;
//
//int dx[] = { 0, 0, 1, -1, 1, 1, -1, -1 };
//int dy[] = { 1, -1, 0, 0, 1, -1, 1, -1 };
//
//int n;
//char a[N][N];
//bool st[N][N] = { 0 };
//
//string s = "yizhong";
//string path;
//
//void dfs(int x, int y, int pos, int p)
//{
//	if (path == s)
//	{
//		int i = x;
//		int j = y;
//		st[i][j] = 1;
//		for (int k = 1; k < 7; k++)
//		{
//			i = i - dx[p];
//			j = j - dy[p];
//			st[i][j] = 1;
//		}
//		return;
//	}
//
//	if (p == -1)
//	{ 
//		for (int k = 0; k < 8; k++)
//		{
//			int i = x + dx[k];
//			int j = y + dy[k];
//			if (i >= 1 && i <= n && j >= 1 && j <= n && a[i][j] == s[pos])
//			{
//				path.push_back(s[pos]);
//				dfs(i, j, pos + 1, k);
//				path.pop_back();
//			}
//		}
//	}
//	else
//	{
//		int i = x + dx[p];
//		int j = y + dy[p];
//		if (a[i][j] == s[pos])
//		{
//			path.push_back(s[pos]);
//			dfs(i, j, pos + 1, p);
//			path.pop_back();
//		}
//	}
//}
//
//int main()
//{
//	cin >> n;
//	for (int i = 1; i <= n; i++)
//	{
//		for (int j = 1; j <= n; j++)
//		{
//			cin >> a[i][j];
//		}
//	}
//
//	for (int i = 1; i <= n; i++)
//	{
//		for (int j = 1; j <= n; j++)
//		{
//			if (a[i][j] == 'y')
//			{
//				path.push_back('y');
//				dfs(i, j, 1, -1);
//				path.pop_back();
//			}
//		}
//	}
//
//	for (int i = 1; i <= n; i++)
//	{
//		for (int j = 1; j <= n; j++)
//		{
//			if (st[i][j])
//			{
//				cout << a[i][j];
//			}
//			else
//			{
//				cout << '*';
//			}
//		}
//		cout << endl;
//	}
//
//	return 0;
//}



//#include <iostream>
//#include <vector>
//using namespace std;
//
//int n;
//vector<int> path;
//
//void dfs(int p, int x)
//{
//	if (x == 0 && path.size() > 1)
//	{
//		int len = path.size() - 1;
//		for (int i = 0; i < len; i++)
//		{
//			cout << path[i] << "+";
//		}
//		cout << path[len] << endl;
//
//		return;
//	}
//
//	for (int i = p; i <= x; i++)
//	{
//		path.push_back(i);
//		dfs(i, x - i);
//		path.pop_back();
//	}
//}
//
//int main()
//{
//	cin >> n;
//	
//	dfs(1, n);
//
//	return 0;
//}


//#include <iostream>
//#include <vector>
//#include <algorithm>
//using namespace std;
//
//const int N = 110;
//
//int n, m;
//vector<int> edges[N];
//int st[N] = { 0 };
//int col[5] = { 0 };
//
//int main()
//{
//	cin >> n >> m;
//	for (int i = 1; i <= m; i++)
//	{
//		int x, y;
//		cin >> x >> y;
//		edges[x].push_back(y);
//		edges[y].push_back(x);
//	}
//
//	for (int i = 1; i <= n; i++)
//	{
//		for (int k = 1; k <= 4; k++)
//		{
//			col[k] = 0;
//		}
//		for (auto ch : edges[i])
//		{
//			col[st[ch]]++;
//		}
//		for (int k = 1; k <= 4; k++)
//		{
//			if (col[k] == 0)
//			{
//				st[i] = k;
//				break;
//			}
//		}
//	}
//	
//	for (int i = 1; i <= n; i++)
//	{
//		cout << st[i];
//	}
//
//	return 0;
//}


#include <iostream>
#include <vector>
#include <cstring>
#include <queue>
using namespace std;

const int N = 810;
const int M = 810;

int n, p, c;
int a[N] = { 0 };
int dist[M] = { 0 };
bool st[M] = { 0 };

vector<pair<int, int>> edges[N];

int dj(int s)
{
	priority_queue <pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> pq;
	memset(dist, 0x3f, sizeof(dist));
	memset(st, 0, sizeof(st));
	dist[s] = 0;
	pq.push({ dist[s], s });

	while (pq.size())
	{
		auto t = pq.top();
		pq.pop();

		int u = t.second;
		if (st[u])
			continue;
		st[u] = 1;

		for (auto ch : edges[u])
		{
			int v = ch.second;
			int w = ch.first;
			if (dist[v] > dist[u] + w)
			{
				dist[v] = dist[u] + w;
				pq.push({ dist[v], v });
			}
		}
	}
	int sum = 0;
	for (int j = 1; j <= n; j++)
	{
		if (dist[j] == 0x3f3f3f3f)
			return 0x3f3f3f3f;
		sum += dist[a[j]];
	}
	return sum;
}

int main()
{
	cin >> n >> p >> c;
	for (int i = 1; i <= n; i++)
	{
		cin >> a[i];
	}
	for (int i = 1; i <= c; i++)
	{
		int x, y, z;
		cin >> x >> y >> z;
		edges[x].push_back({ z, y });
		edges[y].push_back({ z, x });
	}
	
	int ret = 1e9;
	for (int i = 1; i <= p; i++)
	{
		ret = min(ret, dj(i));
	}

	cout << ret << endl;

	return 0;
}
